/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.sys.web.app;

import com.jeeplus.common.json.AjaxJson;
import com.jeeplus.common.utils.CacheUtils;
import com.jeeplus.config.properties.JeePlusProperites;
import com.jeeplus.core.web.BaseController;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.security.util.JWTUtil;
import com.jeeplus.modules.sys.service.LogService;
import com.jeeplus.modules.sys.service.UserService;
import com.jeeplus.modules.sys.utils.UserUtils;
import com.jeeplus.modules.systemswitch.entity.SystemSwitch;
import com.jeeplus.modules.systemswitch.service.SystemSwitchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 登录Controller
 *
 * @author jeeplus
 * @version 2016-5-31
 */
@RestController
@Api(tags = "移动端登录管理")
@RequestMapping("/app")
public class AppLoginController extends BaseController {


    @Autowired
    JeePlusProperites jeePlusProperites;

    @Autowired
    SystemSwitchService systemSwitchService;

    @Autowired
    LogService logService;


    @PostMapping("/sys/login")
    @ApiOperation("登录接口")
    public AjaxJson login(@RequestParam("userName") String userName,
                          @RequestParam("password") String password) {
        AjaxJson j = new AjaxJson();
        User user = UserUtils.getByLoginName(userName);
        if (user != null && UserService.validatePassword(password, user.getPassword())) {

            if (JeePlusProperites.NO.equals(user.getLoginFlag())){
                j.setSuccess(false);
                j.setMsg("该用户已经被禁止登陆!");
            }else {
                User tempUser = new User();
                tempUser.setLoginName(userName);
                // 如果是普通用户需要判断当前普通用户是否可以登录
                if (logService.roleByLoginName(tempUser).equals("common")) {
                    List<SystemSwitch> list = systemSwitchService.findList(new SystemSwitch());
                    // 如果只有一条数据则表明数据整正确
                    if (list.size() == 1){
                        SystemSwitch systemSwitch = list.get(0);
                        if (systemSwitch.getOneClickClose() == 1 || systemSwitch.getOneClickClose() == null || systemSwitch.getOneClickClose().toString().trim().equals("")){
                            // 如果当前状态学生可以进入, 选择为1 不选择都可以进入
                            Date current = new Date();
                            // 加入判空条件
                            if ((systemSwitch.getStartClosingTime() == null && systemSwitch.getEndClosingTime() == null) || (systemSwitch.getStartClosingTime().toString().trim().equals("") && systemSwitch.getEndClosingTime().toString().trim().equals(""))){
                                // 没有设置时间，为1可以直接进入
                                j.setSuccess(true);
                                j.put(JWTUtil.TOKEN, JWTUtil.createAccessToken(userName, user.getPassword()));
                                j.put(JWTUtil.REFRESH_TOKEN, JWTUtil.createRefreshToken(userName, user.getPassword()));
                            } else {
                                if (belongCalendar(current, systemSwitch.getStartClosingTime(), systemSwitch.getEndClosingTime())) {
                                    // 如果当前时间在锁定区间里面
                                    j.setSuccess(false);
                                    j.setMsg("当前系统未开放");
                                } else {
                                    // 允许学生进入（为1 且不在区间内）
                                    j.setSuccess(true);
                                    j.put(JWTUtil.TOKEN, JWTUtil.createAccessToken(userName, user.getPassword()));
                                    j.put(JWTUtil.REFRESH_TOKEN, JWTUtil.createRefreshToken(userName, user.getPassword()));
                                }
                            }
                        } else {
                            j.setSuccess(false);
                            j.setMsg("当前系统未开放");
                        }
                    } else if (list.size() == 0){
                        j.setSuccess(true);
                        j.put(JWTUtil.TOKEN, JWTUtil.createAccessToken(userName, user.getPassword()));
                        j.put(JWTUtil.REFRESH_TOKEN, JWTUtil.createRefreshToken(userName, user.getPassword()));
                    }
                    else {
                        j.setSuccess(false);
                        j.setMsg("时间出现多条");
                    }
                } else {
                    // 如果是高级用户则直接登录
                    j.setSuccess(true);
                    j.put(JWTUtil.TOKEN, JWTUtil.createAccessToken(userName, user.getPassword()));
                    j.put(JWTUtil.REFRESH_TOKEN, JWTUtil.createRefreshToken(userName, user.getPassword()));
                }
            }
        } else {
            j.setSuccess(false);
            j.setMsg("用户名或者密码错误!");
        }
        return j;
    }


    /**
     * 退出登录
     * @throws IOException
     */
    @ApiOperation("用户退出")
    @GetMapping("/sys/logout")
    public AjaxJson logout() {
        AjaxJson j = new AjaxJson();
        String token = UserUtils.getToken();
        if (StringUtils.isNotBlank(token)) {
            CacheUtils.remove(UserUtils.getUser().getLoginName());
            UserUtils.clearCache();
            UserUtils.getSubject().logout();
        }
        j.setMsg("退出成功");
        return j;
    }


    private boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(beginTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        return date.after(begin) && date.before(end);
    }
}
